//����������

//�������: 
	//		������� �������,
	//		������� �������,


#include <tchar.h>
#include "Func.h"
#include "myString.h"
#include "MyStack.h"
#include "MyStack2.h"
//#include <stdexcept>


#define stop __asm nop

int _tmain(int argc, _TCHAR* argv[])
{
////////////////////////////////////////////////////////////////////////////
	//����. ������� �������.
	//�������� ������ ������� ������������ ������� ����
	//�������� - Swap(). ��������� ����������������� ����������
	//������� � ������� ������������ ���� ��������� ����.
	//��������� 1: ���������� ������� ���������� ��������� � .h-����.

	int iX = 1, iY = -1;
	Swap(iX, iY);

	double dX = 0.5, dY = -5.5;
	Swap(dX, dY);
	stop

	//��������� 2: ���������, ��� ����� �����������, ��� ����,
	//			����� ��������� ����� ������� � ��������� MyString
	//			�� ������ ���������, �� � ����������
	MyString str1("One"), str2("Two");
	Swap(str1, str2);


/////////////////////////////////////////////////////////////////////
	
	//����. ������� �������.
	//������� 1.
	//�������� ������ ������ MyStack ��� �������� ��������� ������ ���� T.
	//���������: 1.�������� ����� ���-�� ������� - ������� � ������� ���������
	//			��� �������� ��������������� ������������� � ������ ���������
	//			�������� ������, 
	//			2.��� ������� ������������� ������� ����� ����� ���� �����������
	//			��������-��������� �������
	//			3.������������� ���������� �� ������ �������� "push" � "pop". ���
	//			����, ����� ������������� ���������� ���������� ���� �������� 
	//			������ ���� �� ������������ ���������� � ��������� ��������
	//			4. ������������� ���������� operator[] ����� �������, ����� ������������
	//			��� ������/�������� �������� ������ ��� ���������, ������� �� ����������

	
	//� ������� ������� MyStack �������� ���� �� 5 ��������� int - iStack �
	 
	MyStack<int, 5>ar1; //���� �� 5 ��������� int
	
	try
	{
		ar1.Push(7);
		ar1.Push(8);
		ar1.Push(9);
		ar1.Push(66);
		ar1.Push(345);
		ar1.Push(14);
	}
	catch (std::exception& err)
	{
		std::cerr << "Caught: " << err.what() << std::endl;
		std::cerr << "Type: " << typeid(err).name() << std::endl;
		std::cout << std::endl;
	}

	ar1.Print();

	try
	{
		ar1.Pop();
		ar1.Print();
		ar1.Pop();
		ar1.Pop();
		ar1.Pop();
		ar1.Pop();
		ar1.Pop();
	}
	catch (std::exception& err)
	{
		std::cerr << "Caught: " << err.what() << std::endl;
		std::cerr << "Type: " << typeid(err).name() << std::endl;
		std::cout << std::endl;
	}
	
	ar1.Print();
	stop
	//���� �� 10 ��������� MyString - strStack � ������������������� � ���������
	//push() � pop(), operator[]
	
	MyStack<MyString, 5>ar2;
	try
	{
		ar2.Push(MyString("Hello"));
		ar2.Push(MyString("Wat's App"));
		ar2.Push(MyString("What's your name"));
		ar2.Push(MyString("Nice to meet you"));
		ar2.Push(MyString("Thanks for giving"));
		ar2.Push(MyString("Bye"));

	}
	catch (std::exception& err)
	{
		std::cerr << "Caught: " << err.what() << std::endl;
		std::cerr << "Type: " << typeid(err).name() << std::endl;
		std::cout << std::endl;
	}
	
	ar2.Print();

	try
	{
		ar2.Pop();
		ar2.Print();
		ar2.Pop();
		ar2.Pop();
		ar2.Pop();
		ar2.Pop();
		ar2.Pop();
	}
	catch (std::exception& err)
	{
		std::cerr << "Caught: " << err.what() << std::endl;
		std::cerr << "Type: " << typeid(err).name() << std::endl;
		std::cout << std::endl;
	}
	
	ar2.Print();

	//������� 2. ���������� ������ ����� - MyStack2 ����� �������, ����� 
	//��� �������� ��������� ������������� ����������� ������.
	//���������� ����������� ����������� �������� ����� � ��� �������, � ������� �� ������� (push())
	//������������

	MyStack2<int>list;
	list.Push(3);
	list.Push(5);
	list.Push(7);
	list.Push(12);
	list.Push(44);
	list.Push(1);
	list.Push();
	list.Push(4);

	list.Print();
	list.rPrint();

	MyStack2<int>list2 = list;
	list2.Print();

	/*try 
	{
		list.Pop();
		list.Pop();
		list.Pop();
		list.Pop();
		list.Pop();
		list.Pop();
		list.Pop();
		list.Pop();
		list.Pop();
		list.Pop();		
	}
	catch (std::exception& err)
	{
		std::cerr << "Caught: " << err.what() << std::endl;
		std::cerr << "Type: " << typeid(err).name() << std::endl;
		std::cout << std::endl;
	}
	list.Print();*/

	MyStack2<int>list3 = std::move(list2);
	list2.Print();
	list3.Print();
	
	std::cout << ">" << std::endl;
	list2.Push(7);
	list2.Push(7);
	list3 = list2;
	list3.Print();
	
	std::cout << "=" << std::endl;

	list2.Push(7);
	list2.Push(7);
	list2.Push(7);
	list2.Push(7);
	list2.Push(7);
	list2.Push(7);
	
		
	list2 = list;
	list2.Print();

	std::cout << "<" << std::endl;
	list.Pop();
	list.Pop();
	list.Pop();

	list = list2;
	list.Print();


	return 0;
}

